package top.wanzc.java.basic.demo;

public class FinallyDemo {

	public static void main(String[] args) throws Exception {
		System.out.println(test(1));
	}

	private static int test(int i) throws Exception {
		try {
			int a = 1;
			int c = a / i;
			return c + doTest();
		} catch (Exception e) {
			System.out.println("excepiton");
			return doTest() + 1;
			// throw new RuntimeException(doTest() + "");
		} finally {
			System.out.println("finally");
			//return 2;
		}
	}

	private static int doTest() throws Exception {
		System.out.println("doTest");
		return 3;
	}

}
// javap -c -v -p FinallyDemo.class
// finally的执行时机为finally块中的语句会由java编译器插入到try块和catch块return语句之前，其他语句之后
// 以上述代码为例当在main函数执行System.out.println(test(1))时输出doTest-->finally-->4
// 在main函数执行System.out.println(test(0))时输出excepiton-->doTest-->finally-->4
// 如果把第20行finally语句中的return 2打开，则在main函数执行System.out.println(test(1))时输出doTest-->finally-->2
// 则在main函数执行System.out.println(test(0))时输出excepiton-->doTest-->finally-->2
// 如果继续把第17行catch语句中的throw打开并把16行注释，则在main函数执行System.out.println(test(0))时输出excepiton-->doTest-->finally-->2
